const path = require('path');
const swaggerUE = require('swagger-ui-express');

// 自动化方式: 讀取帶JSDoc註釋的源代碼，並生成OpenAPI（Swagger）規範 - 完整的swagger yml配置 -> 獲取@openapi（或@swagger）的內容  --- yamljs
// require() of ES modules is not supported.  NOTICE:版本7报错;版本6没问题
const swaggerJsdoc = require('swagger-jsdoc');
// 手动化方式: json文件 或者 url返回json响应
// const swaggerDocument = require('./swagger.json');

const options = {
  definition: {
    /**
     * swagger-ui-express大于2.0.8，需要使用openapi3.x规范去编写注释，小于2.0.8可以使用openapi2.x版本。3.x版本不兼容2.x。原因在于3.x中使用requestBody作为数据传输的主体，而2.x中使用的是paramters参数。
     */
    openapi: '3.0.3',
    info: {
      title: '接口文档',
      description:
        '参考选项: [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/)。you can use the api key `special-key` to test the authorization filters. openapi: `3.0.3`',
      termsOfService: 'http://swagger.io/terms/',
      contact: {
        email: 'apiteam@swagger.io',
      },
      license: {
        name: 'Apache 2.0',
        url: 'http://www.apache.org/licenses/LICENSE-2.0.html',
      },
      version: '1.0.0',
    },
    externalDocs: {
      description: 'Find out more about Swagger',
      url: 'http://swagger.io',
    },
    // 当前服务的baseUrl
    servers: [
      { url: 'http://localhost:7003/', name: '本地' },
      { url: 'http://petstore.swagger.io/v2', name: 'production' },
    ],
    // 群组tag
    tags: [
      {
        name: '首页',
        description: 'Everything about `/`',
        externalDocs: {
          description: '更多示例',
          url: 'https://editor.swagger.io/',
        },
      },
      {
        name: '用户',
        description: 'api for users',
      },
    ],
    components: {
      schemas: {
        User: {
          type: 'object',
          properties: {
            id: {
              type: 'integer',
              format: 'int64',
            },
            uuid: {
              type: 'string',
            },
            username: {
              type: 'string',
            },
            phone: {
              type: 'string',
            },
            fixed_tel: {
              type: 'string',
            },
            email: {
              type: 'string',
            },
            password: {
              type: 'string',
            },
            // userStatus: {
            //   type: 'integer',
            //   description: 'User Status',
            //   format: 'int32',
            // },
          },
          xml: {
            name: 'User',
          },
        },
      },
      securitySchemes: {
        petstore_auth: {
          type: 'oauth2',
          flows: {
            implicit: {
              authorizationUrl: 'http://petstore.swagger.io/oauth/dialog',
              scopes: {
                write: '修改权限',
                read: '读取',
              },
            },
          },
        },
        api_key: {
          type: 'apiKey',
          name: 'api_key',
          in: 'header',
        },
      },
    },
  },
  explorer: true,
  customJs: './swagger-lang.js',
  apis: [path.join(__dirname, '../routes/*.js')], // files containing annotations as above
};

module.exports = app => {
  if (app.get('env') === 'development') {
    const openapiSpecification = swaggerJsdoc(options);
    // 开放 swagger 相关接口，
    app.get('/swagger.json', (req, res) => {
      res.setHeader('Content-Type', 'application/json');
      res.send(openapiSpecification);
    });
    // 使用 openapiSpecification 生成 swagger 文档页面，并开放在指定路由
    app.use(
      '/api-docs',
      swaggerUE.serve,
      swaggerUE.setup(openapiSpecification),
    );
  }
};
